package com.tensquare.base.service;

import com.tensquare.base.dao.LabelDao;
import com.tensquare.base.pojo.Label;
import entity.PageResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import util.IdWorker;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

@Service
public class LabelService {
    @Autowired
    private LabelDao labelDao;
    @Autowired
    private IdWorker idWorker;
    //1.查询标签列表
    public List<Label> findAll() {
        //1.1查询并返回标签列表
        return labelDao.findAll();
    }
    //2.添加标签
    public void insert(Label label) {
        //1.设置主键
        label.setId(idWorker.nextId()+"");
        //2.插入数据库
        labelDao.save(label);
    }
    //3.根据id查找标签
    public Label getOne(String labelId) {
        //3.1查询标签并返回
        return labelDao.findById(labelId).get();
    }
    //4.根据id修改标签
    public void update(Label label) {
        //4.1修改标签
        labelDao.save(label);
    }
    //5.根据id删除标签
    public void delete(String labelId) {
        //5.1调用dao层进行删除
        labelDao.deleteById(labelId);
    }
    //6.带条件查询标签
    public List<Label> findSearch(Label label) {
        return labelDao.findAll(createSpecification(label));
    }
    //7.带条件分页查询标签
    public PageResult<Label>findSearch(Label label,int page,int size){
        //7.1创建分页的参数对象
        Pageable pageable=PageRequest.of(page-1,size);
        //7.2得到分页结果对象
        Page<Label> allPage = labelDao.findAll(createSpecification(label), pageable);
        //7.3转换成我们需要的pageResult对象
        return new PageResult<>(allPage.getTotalElements(),allPage.getContent());
    }

    //8.创建查询条件的方法(HQL: Hibernat Query Language)
    //select uname,usex,uage, from User  where sid= xxx;
    private Specification<Label> createSpecification(Label label) {
        return new Specification<Label>() {
            @Override
            //匿名内部类实现方法（参数1：封装查询语句中的属性名和属性类型，参数2：查询条件 ,参数3：查询条件的构建器）
            public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                //1.定义封装查询条件的集合
                ArrayList<Predicate> predicates = new ArrayList<>();
                //2.判断label是否存在
                if(label!=null){
                    //2.1.判断labelname属性是否为空，标签名字
                    if(StringUtils.isNotBlank(label.getLabelname())){
                        //2.1.1.添加labelname模糊查询条件
                        predicates.add(criteriaBuilder.like(root.get("labelname").as(String.class),"%"+label.getLabelname()+"%"));
                    }
                    //2.2判断state属性是否为空，状态
                    if(StringUtils.isNotBlank(label.getState())){
                        //2.2.1添加state等值查询条件
                        predicates.add(criteriaBuilder.equal(root.get("state").as(String.class),label.getState()));
                    }
                    //2.3.判断recommend是否为空，是否推荐
                    if(StringUtils.isNotBlank(label.getRecommend())){
                        //2.3.1添加recommend等值查询条件
                        predicates.add(criteriaBuilder.equal(root.get("recommend").as(String.class),label.getRecommend()));
                    }
                    //3.最后将集合转成数组
                    Predicate[] predicatesArray = predicates.toArray(new Predicate[predicates.size()]);
                    //4.返回结果
                    return criteriaBuilder.and(predicatesArray);
                }
                return null;
            }
        };
    }
}
